// 如果对象或者函数的类型包含null和undefined，那么访问属性或调用函数时就会产生编译错误。
// 因此，对类型保护进行了扩展，以支持对非null和非undefined的检查。
// 使用--strictNullChecks参数进行编译
declare  function f(x: number): string;
let x: number | null | undefined;
if (x) {
    f(x); //正确, 这里的x 类型是number
} else {
    f(x); //错误, 这里的x 类型是number?
}
let a = x != null ? f(x) : "";  // a 的类型是string
let b = x && f(x); // b 的类型是 string | 0 | null | undefined